CBOW (Continuous Bag of Words) Embedding Abstrak#
Notebook ini menjelaskan implementasi CBOW embedding menggunakan Word2Vec untuk menganalisis teks abstrak penelitian. CBOW adalah salah satu arsitektur Word2Vec yang memprediksi kata target berdasarkan konteks kata-kata di sekitarnya.
Tujuan:#
Membuat embedding vektor untuk kata-kata dalam dataset abstrak penelitian
Menggunakan Word2Vec dengan arsitektur CBOW
Mengekstrak fitur numerik dari teks abstrak untuk analisis lebih lanjut
Menganalisis similaritas semantik antar abstrak penelitian
1. Instalasi Library#
Menginstal library yang diperlukan:
plotly: untuk visualisasi interaktifgensim: library utama untuk Word2Vec dan embedding
%%capture
!pip install plotly
!pip install --upgrade gensim
2. Import Library dan Load Data#
Mengimport library yang diperlukan dan memuat dataset abstrak penelitian yang sudah dipreprocessing:
Dataset: hasil_preprocessing_abstrak.csv#
Dataset ini berisi abstrak-abstrak penelitian yang telah melalui proses preprocessing. Struktur data:
abstrak_id: Identifikasi unik untuk setiap abstrak penelitian
hasil_preprocessing: Teks abstrak yang sudah dibersihkan dan diproses
Karakteristik Data:#
Jumlah dokumen: 151 abstrak penelitian
Domain: Berbagai bidang penelitian (manajemen, teknologi, pendidikan, dll)
Bahasa: Indonesia
Format: Teks yang sudah dipreprocessing (tokenisasi, pembersihan, dll)
Library yang Digunakan:#
gensim.models: untuk Word2Vec dan FastTextpandas: untuk manipulasi datasklearn.decomposition.PCA: untuk reduksi dimensimatplotlibdanplotly: untuk visualisasinumpy: untuk operasi numerik
from gensim.models import Word2Vec, FastText
import pandas as pd
import re
from sklearn.decomposition import PCA
from matplotlib import pyplot as plt
import plotly.graph_objects as go
import numpy as np
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('hasil_preprocessing_abstrak.csv')
df
| abstrak_id | hasil_preprocessing | |
|---|---|---|
| 0 | ABSTRAK\r\nSatiyah, Pengaruh Faktor-faktor Pel... | ['abstrak', 'satiyah', 'pengaruh', 'faktorfakt... |
| 1 | Aplikasi nyata pemanfaatan teknologi informasi... | ['aplikasi', 'nyata', 'manfaat', 'teknologi', ... |
| 2 | Tujuan penelitian ini adalah untuk mengetahui ... | ['tuju', 'teliti', 'persepsi', 'brand', 'assoc... |
| 3 | Abstrak\r\nPenelitian ini menggunakan metode k... | ['abstrak', 'teliti', 'metode', 'kuantitatif',... |
| 4 | ABSTRAK\r\n\r\nTujuan penelitian ini adalah un... | ['abstrak', 'tuju', 'teliti', 'identifikasi', ... |
| ... | ... | ... |
| 1021 | ABSTRAK\nPenelitian ini bertujuan untuk menget... | ['abstrak', 'teliti', 'tuju', 'hitung', 'tingk... |
| 1022 | ABSTRAK\nUswatun Hasanah, 160211100291, Pengar... | ['abstrak', 'uswatun', 'hasanah', 'pengaruh', ... |
| 1023 | ABSTRAK\nTujuan dari penelitian ini adalah unt... | ['abstrak', 'tuju', 'teliti', 'peran', 'servic... |
| 1024 | ABSTRAK\nPenelitian ini bertujuan: (1) Untuk m... | ['abstrak', 'teliti', 'tuju', 'baur', 'promosi... |
| 1025 | Penelitian ini bertujuan untuk dapat mengetahu... | ['teliti', 'tuju', 'pengaruh', 'motivasi', 'ke... |
1026 rows × 2 columns
3. Definisi Kelas Custom#
MyTokenizer#
Kelas untuk tokenisasi teks sederhana:
Mengubah teks menjadi lowercase
Memisahkan kata berdasarkan spasi
MeanEmbeddingVectorizer#
Kelas untuk mengubah teks menjadi vektor embedding:
Menggunakan model Word2Vec yang sudah dilatih
Mengambil rata-rata vektor kata untuk setiap dokumen
Menangani kata yang tidak ada dalam vocabulary
from gensim.models import Word2Vec
4. Preprocessing Teks Abstrak#
Membersihkan teks abstrak penelitian dengan:
Konversi ke lowercase: Menyeragamkan format teks untuk konsistensi
Menghapus punctuation: Menghilangkan tanda baca dan karakter non-alfabet
Menghapus HTML tags: Membersihkan tag HTML jika ada dalam teks
Menghapus digit dan karakter khusus: Membersihkan angka dan karakter non-alfabet
Tujuan Preprocessing:#
Menyeragamkan format teks untuk analisis yang lebih baik
Menghilangkan noise yang dapat mengganggu proses embedding
Mempersiapkan teks untuk tokenisasi yang efektif
Hasil preprocessing disimpan dalam kolom ‘clean’.
import numpy as np
class MyTokenizer:
def fit_transform(self, texts):
# Tokenisasi sederhana: lowercase + split
return [str(text).lower().split() for text in texts]
class MeanEmbeddingVectorizer:
def __init__(self, word2vec_model):
self.word2vec = word2vec_model
# Perbaikan: gunakan vector_size (Gensim ≥ 4.0)
self.dim = word2vec_model.wv.vector_size
def fit(self, X, y=None):
return self
def transform(self, X):
X_tokenized = MyTokenizer().fit_transform(X)
embeddings = []
for words in X_tokenized:
# Ambil vektor hanya untuk kata yang ada di vocab
valid_vectors = [
self.word2vec.wv[word] for word in words
if word in self.word2vec.wv
]
if valid_vectors:
embeddings.append(np.mean(valid_vectors, axis=0))
else:
embeddings.append(np.zeros(self.dim))
return np.array(embeddings)
def fit_transform(self, X, y=None):
return self.transform(X)
5. Pembuatan Corpus dan Training Word2Vec#
Pembuatan Corpus dari Abstrak#
Memecah teks abstrak yang sudah dibersihkan menjadi list kata
Setiap abstrak penelitian menjadi list kata terpisah
Corpus akan digunakan untuk melatih model Word2Vec
Training Model Word2Vec untuk Abstrak#
Arsitektur: CBOW (Continuous Bag of Words)
min_count=1: Termasuk semua kata (bahkan yang muncul sekali)
vector_size=56: Dimensi vektor embedding 56
Window: Konteks kata di sekitar kata target (default 5)
Model akan mempelajari representasi vektor untuk setiap kata berdasarkan konteksnya dalam abstrak penelitian
Keunggulan CBOW untuk Abstrak:#
Efektif untuk dataset kecil seperti abstrak penelitian
Mampu menangkap makna kata dalam konteks akademik
Cocok untuk analisis similaritas semantik antar penelitian
clean_txt = []
for w in range(len(df['hasil_preprocessing'])):
desc = str(df['hasil_preprocessing'][w]).lower()
#remove punctuation
desc = re.sub('[^a-zA-Z]', ' ', desc)
#remove tags
desc=re.sub("</?.*?>"," <> ",desc)
#remove digits and special chars
desc=re.sub("(\\d|\\W)+"," ",desc)
clean_txt.append(desc)
df['clean'] = clean_txt
df.head()
| abstrak_id | hasil_preprocessing | clean | |
|---|---|---|---|
| 0 | ABSTRAK\r\nSatiyah, Pengaruh Faktor-faktor Pel... | ['abstrak', 'satiyah', 'pengaruh', 'faktorfakt... | abstrak satiyah pengaruh faktorfaktor latih k... |
| 1 | Aplikasi nyata pemanfaatan teknologi informasi... | ['aplikasi', 'nyata', 'manfaat', 'teknologi', ... | aplikasi nyata manfaat teknologi informasi ko... |
| 2 | Tujuan penelitian ini adalah untuk mengetahui ... | ['tuju', 'teliti', 'persepsi', 'brand', 'assoc... | tuju teliti persepsi brand association langga... |
| 3 | Abstrak\r\nPenelitian ini menggunakan metode k... | ['abstrak', 'teliti', 'metode', 'kuantitatif',... | abstrak teliti metode kuantitatif tekan uji h... |
| 4 | ABSTRAK\r\n\r\nTujuan penelitian ini adalah un... | ['abstrak', 'tuju', 'teliti', 'identifikasi', ... | abstrak tuju teliti identifikasi variabelvari... |
6. Eksplorasi Model Word2Vec untuk Abstrak#
Analisis Similaritas Kata dalam Konteks Akademik#
most_similar(): Mencari kata yang paling mirip dengan kata probe dalam konteks penelitian
most_similar_cosmul(): Mencari kata yang mirip dengan kombinasi kata positif dan negatif
doesnt_match(): Mencari kata yang tidak cocok dalam sekelompok kata terkait penelitian
Eksplorasi Vocabulary Abstrak#
Model akan mempelajari kata-kata khas dalam abstrak penelitian
Terminologi akademik dan teknis akan memiliki representasi vektor yang bermakna
Kata-kata seperti “penelitian”, “analisis”, “metode” akan memiliki similaritas tinggi
Penyimpanan Embedding#
Menyimpan vektor embedding dalam format Word2Vec
File:
abstrak_embd.txt(format teks, bukan binary)Embedding dapat digunakan untuk analisis lebih lanjut atau model lain
df.shape
(1026, 3)
7. Ekstraksi Embedding untuk Abstrak Penelitian#
Menggunakan MeanEmbeddingVectorizer untuk mengubah setiap abstrak penelitian menjadi vektor:
Input: Teks abstrak yang sudah dibersihkan
Proses:
Tokenisasi teks abstrak menjadi kata-kata
Ambil vektor embedding untuk setiap kata dari model Word2Vec
Hitung rata-rata vektor kata untuk mendapatkan representasi abstrak
Output: Vektor 56 dimensi untuk setiap abstrak penelitian
Keunggulan Mean Embedding untuk Abstrak:#
Menangkap makna keseluruhan abstrak penelitian
Mempertahankan informasi semantik dari terminologi akademik
Cocok untuk analisis similaritas antar penelitian
Memungkinkan clustering abstrak berdasarkan topik penelitian
corpus = []
for col in df.clean:
word_list = col.split(" ")
corpus.append(word_list)
#show first value
corpus[0:1]
#generate vectors from corpus
model = Word2Vec(corpus, min_count=1, vector_size = 56)
8. Validasi Embedding#
Memeriksa panjang embedding untuk memastikan konsistensi:
Setiap dokumen harus memiliki vektor dengan panjang 56 (sesuai dengan vector_size)
Ini memastikan bahwa proses embedding berjalan dengan benar
# Explore embeddings safely using an in-vocabulary token
# Pick a common Indonesian token if available, else fallback to the first vocab token
candidate_tokens = ['indonesia', 'pemerintah', 'jakarta', 'presiden', 'ekonomi']
probe = None
for tok in candidate_tokens:
if tok in model.wv:
probe = tok
break
if probe is None:
probe = model.wv.index_to_key[0]
print('Probe token:', probe)
print('Top similar:')
print(model.wv.most_similar(probe)[:10])
# Optional: cosine mul example if tokens exist
pos = [t for t in ['pemerintah', 'indonesia'] if t in model.wv]
neg = [t for t in ['oposisi'] if t in model.wv]
if pos:
print('Cosmul example:')
print(model.wv.most_similar_cosmul(positive=pos, negative=neg)[:10])
# Optional: doesnt_match example when enough tokens exist
cands = [t for t in ['ekonomi', 'politik', 'olahraga', 'jakarta'] if t in model.wv]
if len(cands) >= 3:
print('Odd-one-out:')
print(model.wv.doesnt_match(cands))
# Save embeddings
filename = 'abstrak_embd.txt'
model.wv.save_word2vec_format(filename, binary=False)
Probe token: indonesia
Top similar:
[('efek', 0.958017110824585), ('bursa', 0.9447913765907288), ('devisa', 0.9344190955162048), ('bei', 0.9310687780380249), ('daftar', 0.9256938099861145), ('periode', 0.921766459941864), ('kaca', 0.9186773300170898), ('estate', 0.9085423946380615), ('go', 0.9027281999588013), ('transportasi', 0.8972045183181763)]
Cosmul example:
[('efek', 0.9790076613426208), ('bursa', 0.9723947048187256), ('devisa', 0.9672086834907532), ('bei', 0.9655334949493408), ('daftar', 0.962846040725708), ('periode', 0.9608823657035828), ('kaca', 0.9593377709388733), ('estate', 0.9542703032493591), ('go', 0.951363205909729), ('transportasi', 0.9486013650894165)]
Odd-one-out:
ekonomi
9. Konversi Embedding ke DataFrame#
Mengubah array embedding abstrak menjadi DataFrame dengan kolom terpisah:
Input: Array embedding 2D (151 abstrak penelitian × 56 fitur)
Proses:
Membuat kolom f1, f2, …, f56 untuk setiap dimensi embedding
Mengisi setiap kolom dengan nilai dari dimensi yang sesuai
Output: DataFrame dengan 151 baris dan 56 kolom fitur
Tujuan: Memudahkan analisis dan visualisasi data abstrak penelitian
Manfaat Format DataFrame:#
Memudahkan analisis statistik pada setiap dimensi embedding
Kompatibel dengan library machine learning seperti scikit-learn
Memungkinkan visualisasi distribusi fitur per kategori penelitian
Memudahkan ekspor data untuk analisis lebih lanjut
12. Visualisasi Embedding Abstrak Penelitian#
Menambahkan visualisasi untuk menganalisis hasil embedding abstrak penelitian:
PCA Visualization: Reduksi dimensi untuk visualisasi 2D abstrak penelitian
Similarity Heatmap: Matriks similaritas antar abstrak penelitian
Embedding Distribution: Distribusi nilai embedding per kategori penelitian
Category Analysis: Analisis embedding berdasarkan bidang penelitian
Word Similarity Network: Jaringan similaritas kata dalam konteks akademik
Tujuan Visualisasi:#
Memahami pola distribusi abstrak penelitian dalam ruang embedding
Mengidentifikasi cluster penelitian berdasarkan topik
Menganalisis similaritas semantik antar penelitian
Memvalidasi kualitas embedding yang dihasilkan
mean_embedding_vectorizer = MeanEmbeddingVectorizer(model)
mean_embedded = mean_embedding_vectorizer.fit_transform(df['clean'])
10. Penambahan Label (Opsional)#
Mencoba menambahkan kolom label jika tersedia:
Mencari kolom ‘kategori’ dalam DataFrame asli
Jika ditemukan, menyalin label ke DataFrame embedding
Jika tidak ditemukan, memberikan peringatan
Catatan: Label diperlukan untuk supervised learning atau evaluasi model.
df['array']=list(mean_embedded)
11. Hasil Akhir#
Ringkasan Proses CBOW Embedding untuk Abstrak:#
Preprocessing: Membersihkan teks abstrak penelitian
Training Word2Vec: Membuat model CBOW dengan 56 dimensi
Ekstraksi Embedding: Mengubah abstrak penelitian menjadi vektor numerik
Konversi DataFrame: Mengubah array menjadi format tabular
Visualisasi: Analisis pola dan distribusi embedding
Output yang Dihasilkan:#
DataFrame embedding: 151 baris × 56 kolom fitur
File embedding:
abstrak_embd.txt(format Word2Vec)Model Word2Vec: Siap digunakan untuk analisis similaritas kata dalam konteks akademik
Visualisasi: PCA, heatmap, dan network analysis
Aplikasi Selanjutnya untuk Abstrak Penelitian:#
Clustering abstrak: Mengelompokkan penelitian berdasarkan topik
Klasifikasi bidang penelitian: Mengkategorikan abstrak berdasarkan domain
Analisis similaritas penelitian: Mencari penelitian yang mirip
Visualisasi embedding: PCA/t-SNE untuk eksplorasi pola penelitian
Recommendation system: Mencari penelitian terkait berdasarkan embedding
df.head(5)
| abstrak_id | hasil_preprocessing | clean | array | |
|---|---|---|---|---|
| 0 | ABSTRAK\r\nSatiyah, Pengaruh Faktor-faktor Pel... | ['abstrak', 'satiyah', 'pengaruh', 'faktorfakt... | abstrak satiyah pengaruh faktorfaktor latih k... | [0.36548746, 0.716385, 0.15957196, -0.3679199,... |
| 1 | Aplikasi nyata pemanfaatan teknologi informasi... | ['aplikasi', 'nyata', 'manfaat', 'teknologi', ... | aplikasi nyata manfaat teknologi informasi ko... | [0.16742007, 0.5279538, -0.11527466, -0.279942... |
| 2 | Tujuan penelitian ini adalah untuk mengetahui ... | ['tuju', 'teliti', 'persepsi', 'brand', 'assoc... | tuju teliti persepsi brand association langga... | [0.15432383, 0.6964137, -0.41081175, -0.452757... |
| 3 | Abstrak\r\nPenelitian ini menggunakan metode k... | ['abstrak', 'teliti', 'metode', 'kuantitatif',... | abstrak teliti metode kuantitatif tekan uji h... | [0.58658457, 1.0527209, -0.061899975, -0.90006... |
| 4 | ABSTRAK\r\n\r\nTujuan penelitian ini adalah un... | ['abstrak', 'tuju', 'teliti', 'identifikasi', ... | abstrak tuju teliti identifikasi variabelvari... | [0.31359524, 0.8989767, -0.098680854, -0.85267... |
df['embedding_length'] = df['array'].str.len()
print(df['embedding_length'])
0 56
1 56
2 56
3 56
4 56
..
1021 56
1022 56
1023 56
1024 56
1025 56
Name: embedding_length, Length: 1026, dtype: int64
df.shape
(1026, 5)
num_features = len(df['array'].iloc[0]) # asumsi semua list punya panjang sama
columns = [f'f{i+1}' for i in range(num_features)]
# Inisialisasi dictionary untuk menampung data per kolom
data_dict = {col: [] for col in columns}
# Looping setiap baris di kolom 'embedding'
for embedding_list in df['array']:
for i, value in enumerate(embedding_list):
data_dict[f'f{i+1}'].append(value)
# Buat DataFrame dari dictionary
embedding_df = pd.DataFrame(data_dict)
embedding_df
| f1 | f2 | f3 | f4 | f5 | f6 | f7 | f8 | f9 | f10 | ... | f47 | f48 | f49 | f50 | f51 | f52 | f53 | f54 | f55 | f56 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0.365487 | 0.716385 | 0.159572 | -0.367920 | 0.224299 | -0.008584 | 0.361405 | -0.523220 | 0.168144 | 0.046363 | ... | 0.643608 | 0.964336 | 0.065046 | 0.633086 | -0.098266 | 0.852551 | 0.207564 | 0.639124 | -0.007177 | -0.618843 |
| 1 | 0.167420 | 0.527954 | -0.115275 | -0.279942 | -0.004662 | -0.102450 | 0.611674 | -0.386023 | -0.035535 | 0.173587 | ... | 0.416687 | 0.591297 | 0.133505 | 0.607659 | 0.183871 | 0.454613 | -0.190961 | 0.609408 | 0.242703 | -0.334897 |
| 2 | 0.154324 | 0.696414 | -0.410812 | -0.452758 | 0.050656 | -0.123596 | 0.688204 | -0.365594 | -0.126446 | 0.134907 | ... | 0.756657 | 0.529345 | 0.043140 | 0.527827 | 0.344219 | 0.514495 | -0.303969 | 0.789283 | 0.346497 | -0.363010 |
| 3 | 0.586585 | 1.052721 | -0.061900 | -0.900069 | 0.297022 | 0.291881 | 0.512259 | -0.638588 | 0.400413 | 0.090068 | ... | 1.066514 | 1.110524 | -0.018310 | 0.830326 | -0.144583 | 0.871703 | 0.396844 | 0.809948 | 0.020211 | -0.725453 |
| 4 | 0.313595 | 0.898977 | -0.098681 | -0.852672 | 0.224413 | -0.075044 | 0.736564 | -0.296571 | 0.440990 | 0.380296 | ... | 1.118501 | 0.740074 | -0.085555 | 1.228455 | 0.000684 | 0.714946 | 0.184974 | 0.787050 | 0.521311 | -0.432489 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1021 | 0.073671 | 0.608046 | -0.054002 | -0.270766 | -0.107290 | 0.000393 | 0.268269 | -0.602032 | 0.010310 | -0.129304 | ... | 0.264000 | 0.426607 | 0.053954 | 0.253736 | 0.133076 | 0.452963 | -0.039510 | 0.589059 | 0.345337 | -0.548607 |
| 1022 | 0.593354 | 1.037423 | 0.422915 | -0.712085 | 0.214765 | 0.166399 | 0.054129 | -0.901139 | 0.624075 | -0.019217 | ... | 0.743601 | 1.158916 | 0.115424 | 0.966210 | -0.372967 | 1.069085 | 0.624109 | 0.513385 | -0.000435 | -1.011996 |
| 1023 | 0.350669 | 0.940788 | -0.331761 | -0.749276 | 0.028689 | 0.161183 | 0.615456 | -0.641041 | 0.224344 | 0.058748 | ... | 0.841594 | 0.721994 | 0.036967 | 0.583049 | 0.150275 | 0.597719 | 0.055457 | 0.764084 | 0.274789 | -0.650594 |
| 1024 | -0.126984 | 0.728735 | 0.106582 | -0.529795 | 0.202731 | -0.182372 | 0.762032 | -0.251091 | 0.195888 | 0.301766 | ... | 0.835412 | 0.552028 | -0.214962 | 1.344962 | 0.088150 | 0.517858 | 0.026125 | 0.700737 | 0.763998 | -0.047956 |
| 1025 | 0.679734 | 0.705006 | 0.270415 | -0.366951 | 0.314789 | 0.088967 | 0.257736 | -0.583103 | 0.152048 | -0.025278 | ... | 0.697545 | 1.217594 | 0.119447 | 0.769881 | -0.186109 | 0.946621 | 0.105962 | 0.677135 | -0.139797 | -0.689392 |
1026 rows × 56 columns
# Cek apakah ada kolom label yang tersedia pada df
possible_labels = ['kategori', 'category', 'label', 'bidang', 'domain']
label_col = None
for c in possible_labels:
if c in df.columns:
label_col = c
break
if label_col is not None:
embedding_df[label_col] = df[label_col].values
print(f'✅ Kolom label "{label_col}" berhasil ditambahkan ke embedding_df')
else:
print('ℹ️ Tidak ditemukan kolom label di df. Visualisasi akan dilakukan tanpa kategori.')
print(' Kolom yang tersedia di df:', list(df.columns))
ℹ️ Tidak ditemukan kolom label di df. Visualisasi akan dilakukan tanpa kategori.
Kolom yang tersedia di df: ['abstrak_id', 'hasil_preprocessing', 'clean', 'array', 'embedding_length']
embedding_df
| f1 | f2 | f3 | f4 | f5 | f6 | f7 | f8 | f9 | f10 | ... | f47 | f48 | f49 | f50 | f51 | f52 | f53 | f54 | f55 | f56 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0.365487 | 0.716385 | 0.159572 | -0.367920 | 0.224299 | -0.008584 | 0.361405 | -0.523220 | 0.168144 | 0.046363 | ... | 0.643608 | 0.964336 | 0.065046 | 0.633086 | -0.098266 | 0.852551 | 0.207564 | 0.639124 | -0.007177 | -0.618843 |
| 1 | 0.167420 | 0.527954 | -0.115275 | -0.279942 | -0.004662 | -0.102450 | 0.611674 | -0.386023 | -0.035535 | 0.173587 | ... | 0.416687 | 0.591297 | 0.133505 | 0.607659 | 0.183871 | 0.454613 | -0.190961 | 0.609408 | 0.242703 | -0.334897 |
| 2 | 0.154324 | 0.696414 | -0.410812 | -0.452758 | 0.050656 | -0.123596 | 0.688204 | -0.365594 | -0.126446 | 0.134907 | ... | 0.756657 | 0.529345 | 0.043140 | 0.527827 | 0.344219 | 0.514495 | -0.303969 | 0.789283 | 0.346497 | -0.363010 |
| 3 | 0.586585 | 1.052721 | -0.061900 | -0.900069 | 0.297022 | 0.291881 | 0.512259 | -0.638588 | 0.400413 | 0.090068 | ... | 1.066514 | 1.110524 | -0.018310 | 0.830326 | -0.144583 | 0.871703 | 0.396844 | 0.809948 | 0.020211 | -0.725453 |
| 4 | 0.313595 | 0.898977 | -0.098681 | -0.852672 | 0.224413 | -0.075044 | 0.736564 | -0.296571 | 0.440990 | 0.380296 | ... | 1.118501 | 0.740074 | -0.085555 | 1.228455 | 0.000684 | 0.714946 | 0.184974 | 0.787050 | 0.521311 | -0.432489 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1021 | 0.073671 | 0.608046 | -0.054002 | -0.270766 | -0.107290 | 0.000393 | 0.268269 | -0.602032 | 0.010310 | -0.129304 | ... | 0.264000 | 0.426607 | 0.053954 | 0.253736 | 0.133076 | 0.452963 | -0.039510 | 0.589059 | 0.345337 | -0.548607 |
| 1022 | 0.593354 | 1.037423 | 0.422915 | -0.712085 | 0.214765 | 0.166399 | 0.054129 | -0.901139 | 0.624075 | -0.019217 | ... | 0.743601 | 1.158916 | 0.115424 | 0.966210 | -0.372967 | 1.069085 | 0.624109 | 0.513385 | -0.000435 | -1.011996 |
| 1023 | 0.350669 | 0.940788 | -0.331761 | -0.749276 | 0.028689 | 0.161183 | 0.615456 | -0.641041 | 0.224344 | 0.058748 | ... | 0.841594 | 0.721994 | 0.036967 | 0.583049 | 0.150275 | 0.597719 | 0.055457 | 0.764084 | 0.274789 | -0.650594 |
| 1024 | -0.126984 | 0.728735 | 0.106582 | -0.529795 | 0.202731 | -0.182372 | 0.762032 | -0.251091 | 0.195888 | 0.301766 | ... | 0.835412 | 0.552028 | -0.214962 | 1.344962 | 0.088150 | 0.517858 | 0.026125 | 0.700737 | 0.763998 | -0.047956 |
| 1025 | 0.679734 | 0.705006 | 0.270415 | -0.366951 | 0.314789 | 0.088967 | 0.257736 | -0.583103 | 0.152048 | -0.025278 | ... | 0.697545 | 1.217594 | 0.119447 | 0.769881 | -0.186109 | 0.946621 | 0.105962 | 0.677135 | -0.139797 | -0.689392 |
1026 rows × 56 columns
embedding_df.shape
(1026, 56)
# 1. PCA Visualization untuk Embedding Abstrak
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
try:
# Cek apakah embedding_df sudah ada
if 'embedding_df' not in locals():
print("❌ Error: embedding_df belum dibuat. Jalankan cell sebelumnya terlebih dahulu.")
else:
print("📊 Membuat PCA visualization untuk embedding abstrak penelitian...")
print(f" Shape embedding_df: {embedding_df.shape}")
# Reduksi dimensi dengan PCA
pca = PCA(n_components=2)
embedding_2d = pca.fit_transform(embedding_df.iloc[:, :]) # Gunakan semua kolom fitur
# Visualisasi dengan Matplotlib (tanpa kategori karena tidak tersedia)
plt.figure(figsize=(12, 8))
# Plot semua titik dengan warna yang sama karena tidak ada kategori
scatter = plt.scatter(embedding_2d[:, 0], embedding_2d[:, 1],
c='blue', alpha=0.7, s=50, label='Abstrak Penelitian')
plt.xlabel(f'PC1 ({pca.explained_variance_ratio_[0]:.2%} variance)', fontsize=12)
plt.ylabel(f'PC2 ({pca.explained_variance_ratio_[1]:.2%} variance)', fontsize=12)
plt.title('PCA Visualization of Abstract Research Embeddings', fontsize=14)
plt.legend(fontsize=12)
plt.grid(True, alpha=0.3)
# Tambahkan informasi tambahan
plt.text(0.02, 0.98, f'Total abstrak: {len(embedding_2d)}',
transform=plt.gca().transAxes, fontsize=10,
verticalalignment='top', bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.8))
plt.tight_layout()
plt.show()
# Statistik PCA
print(f"\n📈 Statistik PCA:")
print(f" Explained variance ratio - PC1: {pca.explained_variance_ratio_[0]:.3f}")
print(f" Explained variance ratio - PC2: {pca.explained_variance_ratio_[1]:.3f}")
print(f" Total explained variance: {pca.explained_variance_ratio_.sum():.3f}")
print(f" Jumlah abstrak penelitian: {len(embedding_2d)}")
print(f" Dimensi asli: {embedding_df.shape[1]}")
print(f" Dimensi setelah PCA: {embedding_2d.shape[1]}")
except Exception as e:
print(f"❌ Error: {e}")
print("Pastikan semua cell sebelumnya sudah dijalankan dengan benar.")
📊 Membuat PCA visualization untuk embedding abstrak penelitian...
Shape embedding_df: (1026, 56)
📈 Statistik PCA:
Explained variance ratio - PC1: 0.489
Explained variance ratio - PC2: 0.214
Total explained variance: 0.703
Jumlah abstrak penelitian: 1026
Dimensi asli: 56
Dimensi setelah PCA: 2
# 2. Similarity Heatmap untuk beberapa abstrak penelitian
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
try:
# Cek apakah embedding_df sudah ada
if 'embedding_df' not in locals():
print("❌ Error: embedding_df belum dibuat. Jalankan cell sebelumnya terlebih dahulu.")
else:
# Ambil sample 20 abstrak untuk heatmap
sample_size = min(20, len(embedding_df))
sample_indices = np.random.choice(len(embedding_df), sample_size, replace=False)
sample_embeddings = embedding_df.iloc[sample_indices, :] # Gunakan semua kolom fitur
print(f"📊 Membuat similarity heatmap untuk {sample_size} abstrak penelitian...")
print(f" Shape sample embeddings: {sample_embeddings.shape}")
# Hitung cosine similarity
similarity_matrix = cosine_similarity(sample_embeddings)
# Visualisasi heatmap dengan Matplotlib
plt.figure(figsize=(12, 10))
im = plt.imshow(similarity_matrix, cmap='viridis', aspect='auto', vmin=0, vmax=1)
plt.colorbar(im, label='Cosine Similarity')
plt.title('Cosine Similarity Matrix of Abstract Research Embeddings (Sample)', fontsize=14)
plt.xlabel('Abstract Index', fontsize=12)
plt.ylabel('Abstract Index', fontsize=12)
# Tambahkan label indeks abstrak
for i in range(sample_size):
plt.text(i, -0.5, f'A{i+1}', rotation=45, ha='right', va='top', fontsize=8)
plt.text(-0.5, i, f'A{i+1}', rotation=0, ha='right', va='center', fontsize=8)
# Tambahkan grid untuk memudahkan membaca
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# Statistik similarity
print(f"\n📈 Statistik Similarity Matrix:")
print(f" Shape: {similarity_matrix.shape}")
print(f" Average similarity: {similarity_matrix.mean():.3f}")
print(f" Max similarity: {similarity_matrix.max():.3f}")
print(f" Min similarity: {similarity_matrix.min():.3f}")
print(f" Standard deviation: {similarity_matrix.std():.3f}")
# Cari pasangan abstrak yang paling similar
np.fill_diagonal(similarity_matrix, 0) # Hapus diagonal (similarity dengan diri sendiri)
max_sim_idx = np.unravel_index(np.argmax(similarity_matrix), similarity_matrix.shape)
print(f" Most similar pair: A{max_sim_idx[0]+1} & A{max_sim_idx[1]+1} (similarity: {similarity_matrix[max_sim_idx]:.3f})")
except Exception as e:
print(f"❌ Error: {e}")
print("Pastikan semua cell sebelumnya sudah dijalankan dengan benar.")
📊 Membuat similarity heatmap untuk 20 abstrak penelitian...
Shape sample embeddings: (20, 56)
📈 Statistik Similarity Matrix:
Shape: (20, 20)
Average similarity: 0.803
Max similarity: 1.000
Min similarity: 0.395
Standard deviation: 0.132
Most similar pair: A7 & A11 (similarity: 0.990)
# 3. Distribusi Embedding untuk Abstrak Penelitian
import matplotlib.pyplot as plt
import numpy as np
try:
# Cek apakah embedding_df sudah ada
if 'embedding_df' not in locals():
print("❌ Error: embedding_df belum dibuat. Jalankan cell sebelumnya terlebih dahulu.")
else:
print("📊 Membuat distribusi embedding untuk abstrak penelitian...")
fig, axes = plt.subplots(2, 2, figsize=(15, 10))
axes = axes.ravel()
# Ambil beberapa fitur untuk dianalisis
feature_cols = ['f1', 'f2', 'f3', 'f4']
for i, feature in enumerate(feature_cols):
# Plot distribusi untuk semua abstrak (tanpa kategori)
data = embedding_df[feature]
axes[i].hist(data, alpha=0.7, color='skyblue', bins=20, edgecolor='black')
axes[i].set_title(f'Distribution of {feature} for Abstract Research', fontsize=12)
axes[i].set_xlabel(f'{feature} Value', fontsize=10)
axes[i].set_ylabel('Frequency', fontsize=10)
axes[i].grid(True, alpha=0.3)
# Tambahkan statistik
mean_val = data.mean()
std_val = data.std()
axes[i].axvline(mean_val, color='red', linestyle='--', linewidth=2, label=f'Mean: {mean_val:.3f}')
axes[i].axvline(mean_val + std_val, color='orange', linestyle=':', linewidth=2, label=f'±1σ: {std_val:.3f}')
axes[i].axvline(mean_val - std_val, color='orange', linestyle=':', linewidth=2)
axes[i].legend(fontsize=9)
plt.suptitle('Distribution of Embedding Features for Abstract Research', fontsize=14)
plt.tight_layout()
plt.show()
# Statistik detail
print(f"\n📈 Statistik Distribusi Embedding untuk 4 fitur pertama:")
print("-" * 60)
for feature in feature_cols:
data = embedding_df[feature]
print(f"{feature:>3}: Mean={data.mean():>7.3f}, Std={data.std():>7.3f}, Min={data.min():>7.3f}, Max={data.max():>7.3f}")
# Statistik keseluruhan
all_features = embedding_df.columns
print(f"\n📊 Statistik Keseluruhan ({len(all_features)} fitur):")
print(f" Mean keseluruhan: {embedding_df.values.mean():.3f}")
print(f" Std keseluruhan: {embedding_df.values.std():.3f}")
print(f" Min keseluruhan: {embedding_df.values.min():.3f}")
print(f" Max keseluruhan: {embedding_df.values.max():.3f}")
except Exception as e:
print(f"❌ Error: {e}")
print("Pastikan semua cell sebelumnya sudah dijalankan dengan benar.")
📊 Membuat distribusi embedding untuk abstrak penelitian...
📈 Statistik Distribusi Embedding untuk 4 fitur pertama:
------------------------------------------------------------
f1: Mean= 0.209, Std= 0.336, Min= -0.474, Max= 1.020
f2: Mean= 0.878, Std= 0.173, Min= 0.271, Max= 1.341
f3: Mean= -0.001, Std= 0.242, Min= -0.715, Max= 0.634
f4: Mean= -0.500, Std= 0.210, Min= -1.127, Max= 0.093
📊 Statistik Keseluruhan (56 fitur):
Mean keseluruhan: 0.053
Std keseluruhan: 0.576
Min keseluruhan: -2.298
Max keseluruhan: 2.291
# 5. Analisis Similaritas Kata dengan Word2Vec
# Ambil beberapa kata yang ada dalam vocabulary
vocab_words = list(model.wv.key_to_index.keys())[:20] # Ambil 20 kata pertama
# Hitung similarity matrix untuk kata-kata
word_similarities = []
for word1 in vocab_words:
row = []
for word2 in vocab_words:
if word1 in model.wv and word2 in model.wv:
similarity = model.wv.similarity(word1, word2)
row.append(similarity)
else:
row.append(0)
word_similarities.append(row)
word_similarities = np.array(word_similarities)
# Visualisasi heatmap similarity kata
plt.figure(figsize=(12, 10))
plt.imshow(word_similarities, cmap='viridis', aspect='auto')
plt.colorbar(label='Word Similarity')
plt.title('Word Similarity Matrix (Word2Vec)')
plt.xlabel('Words')
plt.ylabel('Words')
# Set labels
plt.xticks(range(len(vocab_words)), vocab_words, rotation=45, ha='right')
plt.yticks(range(len(vocab_words)), vocab_words)
plt.tight_layout()
plt.show()
print(f"Vocabulary size: {len(model.wv.key_to_index)}")
print(f"Sample words: {vocab_words[:10]}")
Vocabulary size: 6500
Sample words: ['pengaruh', 'kerja', 'teliti', 'variabel', 'usaha', 'signifikan', 'uji', 'karyawan', '', 'nilai']
# Test Plotly setelah install nbformat
import plotly.express as px
import pandas as pd
import numpy as np
# Buat data test sederhana
test_data = pd.DataFrame({
'x': np.random.randn(10),
'y': np.random.randn(10),
'category': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'B', 'A', 'C']
})
# Test plotly
fig = px.scatter(test_data, x='x', y='y', color='category', title='Test Plotly')
fig.show()
print("✅ Plotly berhasil dijalankan! Error nbformat sudah teratasi.")
✅ Plotly berhasil dijalankan! Error nbformat sudah teratasi.
# Solusi 2: Install ulang library di dalam notebook
import sys
!{sys.executable} -m pip install --upgrade nbformat ipython
Requirement already satisfied: nbformat in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (5.10.4)
Requirement already satisfied: ipython in c:\users\user\appdata\roaming\python\python311\site-packages (9.6.0)
Requirement already satisfied: fastjsonschema>=2.15 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from nbformat) (2.21.2)
Requirement already satisfied: jsonschema>=2.6 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from nbformat) (4.25.1)
Requirement already satisfied: jupyter-core!=5.0.*,>=4.12 in c:\users\user\appdata\roaming\python\python311\site-packages (from nbformat) (5.8.1)
Requirement already satisfied: traitlets>=5.1 in c:\users\user\appdata\roaming\python\python311\site-packages (from nbformat) (5.14.3)
Requirement already satisfied: colorama in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from ipython) (0.4.6)
Requirement already satisfied: decorator in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (5.2.1)
Requirement already satisfied: ipython-pygments-lexers in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (1.1.1)
Requirement already satisfied: jedi>=0.16 in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (0.19.2)
Requirement already satisfied: matplotlib-inline in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (0.1.7)
Requirement already satisfied: prompt_toolkit<3.1.0,>=3.0.41 in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (3.0.52)
Requirement already satisfied: pygments>=2.4.0 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from ipython) (2.19.2)
Requirement already satisfied: stack_data in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (0.6.3)
Requirement already satisfied: typing_extensions>=4.6 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from ipython) (4.15.0)
Requirement already satisfied: wcwidth in c:\users\user\appdata\roaming\python\python311\site-packages (from prompt_toolkit<3.1.0,>=3.0.41->ipython) (0.2.14)
Requirement already satisfied: parso<0.9.0,>=0.8.4 in c:\users\user\appdata\roaming\python\python311\site-packages (from jedi>=0.16->ipython) (0.8.5)
Requirement already satisfied: attrs>=22.2.0 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from jsonschema>=2.6->nbformat) (25.3.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from jsonschema>=2.6->nbformat) (2025.9.1)
Requirement already satisfied: referencing>=0.28.4 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from jsonschema>=2.6->nbformat) (0.36.2)
Requirement already satisfied: rpds-py>=0.7.1 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from jsonschema>=2.6->nbformat) (0.27.1)
Requirement already satisfied: platformdirs>=2.5 in c:\users\user\appdata\roaming\python\python311\site-packages (from jupyter-core!=5.0.*,>=4.12->nbformat) (4.4.0)
Requirement already satisfied: pywin32>=300 in c:\users\user\appdata\roaming\python\python311\site-packages (from jupyter-core!=5.0.*,>=4.12->nbformat) (311)
Requirement already satisfied: executing>=1.2.0 in c:\users\user\appdata\roaming\python\python311\site-packages (from stack_data->ipython) (2.2.1)
Requirement already satisfied: asttokens>=2.1.0 in c:\users\user\appdata\roaming\python\python311\site-packages (from stack_data->ipython) (3.0.0)
Requirement already satisfied: pure-eval in c:\users\user\appdata\roaming\python\python311\site-packages (from stack_data->ipython) (0.2.3)
# Solusi 3: Set renderer plotly yang berbeda
import plotly.io as pio
# Coba beberapa renderer yang berbeda
try:
# Renderer untuk Jupyter notebook
pio.renderers.default = "notebook"
print("✅ Renderer set ke 'notebook'")
except:
try:
# Renderer untuk browser
pio.renderers.default = "browser"
print("✅ Renderer set ke 'browser'")
except:
# Renderer HTML
pio.renderers.default = "html"
print("✅ Renderer set ke 'html'")
# Test dengan data sederhana
import plotly.express as px
import pandas as pd
import numpy as np
test_data = pd.DataFrame({
'x': [1, 2, 3, 4, 5],
'y': [2, 4, 1, 3, 5],
'category': ['A', 'B', 'A', 'C', 'B']
})
fig = px.scatter(test_data, x='x', y='y', color='category', title='Test Plotly dengan Renderer Baru')
fig.show()
✅ Renderer set ke 'notebook'